////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2011-2012 www.iflytek.com. All Rights Reserved.
//  This software for customer relationship management system, developed by Noo team.
//  Software code and design for the team, copy rights reserved.
////////////////////////////////////////////////////////////////////////////////

package com.iflytek.ci.main.controller;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;

import com.google.common.collect.Maps;
import com.iflytek.framework.web.messages.AjaxMessage;
import org.apache.log4j.Logger;
import org.springframework.validation.ObjectError;


import static com.iflytek.framework.web.messages.AjaxMessage.instance;
import static com.iflytek.framework.web.messages.AjaxMessage.ERROR;
import static com.iflytek.framework.web.messages.AjaxMessage.WARN;

/**
 * <p>
 * 基础Contrller，简化一些常用的操作.
 * </p>
 *
 * @author poplar.yfyang
 * @version 1.0 2012-10-27 7:11 PM
 * @since JDK 1.5
 */
public abstract class BaseController implements Serializable {
	/** Serial version */
	private static final long serialVersionUID = 5443011068126014556L;
	/** 日志 */
	protected static Logger logger;

	/** 构造Controller，启动日志 */
	protected BaseController() {
		logger = Logger.getLogger(getClass());
	}

	/**
	 * 重定向到给定的URL
	 *
	 * @param url 指定URL
	 * @return Spring MVC跳转URL的字符串标记
	 */
	protected static String rediect(String url) {
		return String.format("redirect:%s", url);
	}

	/**
	 * 构造一个普通的Ajax返回信息
	 *
	 * @param message 信息内容
	 * @return ajax返回对象
	 */
	protected static AjaxMessage ajax_info(String message) {
		return instance(message);
	}

	/**
	 * 构造一个出现错误信息的Ajax返回信息
	 *
	 * @param message 错误信息
	 * @return ajax返回对象
	 */
	protected static AjaxMessage ajax_error(String message) {
		return instance(ERROR, message);
	}

	/**
	 * 构造一个警告信息的Ajax返回信息
	 *
	 * @param message 警告信息
	 * @return ajax返回对象
	 */
	protected static AjaxMessage ajax_warn(String message) {
		return instance(WARN, message);
	}

	/**
	 * 构造一个普通的Ajax返回信息并且可以附加一些其他信息
	 *
	 * @param message     信息内容
	 * @param other_infos 其他信息
	 * @return ajax返回对象
	 */
	protected static AjaxMessage ajax_info(String message, Map<String, Object> other_infos) {
		final AjaxMessage ajaxMessage = instance(message);
		ajaxMessage.setInfos(other_infos);
		return ajaxMessage;
	}

	/**
	 * 构造一个出现错误信息的Ajax返回信息 并且可以附加一些其他信息
	 *
	 * @param message     错误信息
	 * @param other_infos 其他信息
	 * @return ajax返回对象
	 */
	protected static AjaxMessage ajax_error(String message, Map<String, Object> other_infos) {
		final AjaxMessage ajax_message = instance(ERROR, message);
		ajax_message.setInfos(other_infos);
		return ajax_message;
	}

	/**
	 * * 构造一个警告信息的Ajax返回信息附件一些其他的信息
	 *
	 * @param message     信息内容
	 * @param other_infos 其他信息
	 * @return ajax返回对象
	 */
	protected static AjaxMessage ajax_warn(String message, Map<String, Object> other_infos) {
		final AjaxMessage ajax_message = instance(WARN, message);
		ajax_message.setInfos(other_infos);
		return ajax_message;
	}

	/**
	 * 得到服务器项目 的根目录
	 *
	 * @param request request请求
	 * @return base_path  的url
	 */
	protected static String get_base_path(HttpServletRequest request) {
		return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";
	}

	/**
	 * 得到服务器项目 的真实目录
	 *
	 * @param request request请求
	 * @return 项目真实 的目录
	 */
	protected static String get_real_path(HttpServletRequest request) {
		return request.getSession().getServletContext().getRealPath("/");
	}

	/**
	 * 建立ajax验证错误信息
	 *
	 * @param msg       提示信息
	 * @param allErrors 具体的验证信息
	 * @return ajax提示信息对象
	 */
	protected AjaxMessage ajax_error(String msg, List<ObjectError> allErrors) {
		final AjaxMessage ajaxMessage = instance(ERROR, msg);
		final Map<String, Object> infos = Maps.newHashMap();
		for (ObjectError allError : allErrors) {
			infos.put(allError.getObjectName(), allError.toString());
		}
		ajaxMessage.setInfos(infos);
		return ajaxMessage;
	}
}
